#pragma once
#include "gp_Ax22d.h"
#include "gp_Ax2d.h"
#include "gp_Pnt2d.h"

class gp_Ax2d;
class gp_Ax22d;
class gp_Pnt2d;
class gp_Trsf2d;
class gp_Vec2d;


 
//! Describes an ellipse in the plane (2D space). <br>
//! An ellipse is defined by its major and minor radii and <br>
//! positioned in the plane with a coordinate system (a <br>
//! gp_Ax22d object) as follows: <br>
//! -   the origin of the coordinate system is the center of the ellipse, <br>
//! -   its "X Direction" defines the major axis of the ellipse, and <br>
//! -   its "Y Direction" defines the minor axis of the ellipse. <br>
//! This coordinate system is the "local coordinate system" <br>
//! of the ellipse. Its orientation (direct or indirect) gives an <br>
//! implicit orientation to the ellipse. In this coordinate <br>
//! system, the equation of the ellipse is: <br>
//! X*X / (MajorRadius**2) + Y*Y / (MinorRadius**2) = 1.0 <br>
//! See Also <br>
//! gce_MakeElips2d which provides functions for more <br>
//! complex ellipse constructions <br>
//! Geom2d_Ellipse which provides additional functions for <br>
//! constructing ellipses and works, in particular, with the <br>
//! parametric equations of ellipses <br>
class gp_Elips2d  {

public:

  

  //! Creates an indefinite ellipse. <br>
      gp_Elips2d();
  
//!  Creates an ellipse with the major axis, the major and the <br>
//!  minor radius. The location of the MajorAxis is the center <br>
//!  of the  ellipse. <br>
//!  The sense of parametrization is given by Sense. <br>
//!  Warnings : <br>
//!  It is possible to create an ellipse with <br>
//!  MajorRadius = MinorRadius. <br>
//!  Raises ConstructionError if MajorRadius < MinorRadius or MinorRadius < 0.0 <br>
      gp_Elips2d(const gp_Ax2d& MajorAxis,const double MajorRadius,const double MinorRadius,const bool Sense = true);
  //!  Creates an ellipse with radii MajorRadius and <br>
//!   MinorRadius, positioned in the plane by coordinate system A where: <br>
//!   -   the origin of A is the center of the ellipse, <br>
//!   -   the "X Direction" of A defines the major axis of <br>
//!    the ellipse, that is, the major radius MajorRadius <br>
//!    is measured along this axis, and <br>
//!   -   the "Y Direction" of A defines the minor axis of <br>
//!    the ellipse, that is, the minor radius MinorRadius <br>
//!    is measured along this axis, and <br>
//!   -   the orientation (direct or indirect sense) of A <br>
//!    gives the orientation of the ellipse. <br>
//!  Warnings : <br>
//!  It is possible to create an ellipse with <br>
//!  MajorRadius = MinorRadius. <br>
//! Raises ConstructionError if MajorRadius < MinorRadius or MinorRadius < 0.0 <br>
     gp_Elips2d(const gp_Ax22d& A,const double MajorRadius,const double MinorRadius);
  //! Modifies this ellipse, by redefining its local coordinate system so that <br>
//! -   its origin becomes P. <br>
       void SetLocation(const gp_Pnt2d& P) ;
  //! Changes the value of the major radius. <br>
//! Raises ConstructionError if MajorRadius < MinorRadius. <br>
       void SetMajorRadius(const double MajorRadius) ;
  //! Changes the value of the minor radius. <br>
//! Raises ConstructionError if MajorRadius < MinorRadius or MinorRadius < 0.0 <br>
       void SetMinorRadius(const double MinorRadius) ;
  //! Modifies this ellipse, by redefining its local coordinate system so that <br>
//!    it becomes A. <br>
       void SetAxis(const gp_Ax22d& A) ;
  //! Modifies this ellipse, by redefining its local coordinate system so that <br>
//!   its origin and its "X Direction"  become those <br>
//! of the axis A. The "Y  Direction"  is then <br>
//!   recomputed. The orientation of the local coordinate <br>
//!   system is not modified. <br>
       void SetXAxis(const gp_Ax2d& A) ;
  //! Modifies this ellipse, by redefining its local coordinate system so that <br>
//!   its origin and its "Y Direction"  become those <br>
//! of the axis A. The "X  Direction"  is then <br>
//!   recomputed. The orientation of the local coordinate <br>
//!   system is not modified. <br>
       void SetYAxis(const gp_Ax2d& A) ;
  //! Computes the area of the ellipse. <br>
        double Area() const;
  
//!  Returns the coefficients of the implicit equation of the ellipse. <br>
//!  A * (X**2) + B * (Y**2) + 2*C*(X*Y) + 2*D*X + 2*E*Y + F = 0. <br>
       void Coefficients(double& A,double& B,double& C,double& D,double& E,double& F) const;
  
//!  This directrix is the line normal to the XAxis of the ellipse <br>
//!  in the local plane (Z = 0) at a distance d = MajorRadius / e <br>
//!  from the center of the ellipse, where e is the eccentricity of <br>
//!  the ellipse. <br>
//!  This line is parallel to the "YAxis". The intersection point <br>
//!  between directrix1 and the "XAxis" is the location point of the <br>
//!  directrix1. This point is on the positive side of the "XAxis". <br>
//!  Raised if Eccentricity = 0.0. (The ellipse degenerates into a <br>
//!  circle) <br>
        gp_Ax2d Directrix1() const;
  
//!  This line is obtained by the symmetrical transformation <br>
//!  of "Directrix1" with respect to the minor axis of the ellipse. <br>
//!  Raised if Eccentricity = 0.0. (The ellipse degenerates into a <br>
//!  circle). <br>
        gp_Ax2d Directrix2() const;
  
//!  Returns the eccentricity of the ellipse  between 0.0 and 1.0 <br>
//!  If f is the distance between the center of the ellipse and <br>
//!  the Focus1 then the eccentricity e = f / MajorRadius. <br>
//!  Returns 0 if MajorRadius = 0. <br>
        double Eccentricity() const;
  
//!  Returns the distance between the center of the ellipse <br>
//!  and focus1 or focus2. <br>
        double Focal() const;
  
//!  Returns the first focus of the ellipse. This focus is on the <br>
//!  positive side of the major axis of the ellipse. <br>
        gp_Pnt2d Focus1() const;
  
//!  Returns the second focus of the ellipse. This focus is on the <br>
//!  negative side of the major axis of the ellipse. <br>
        gp_Pnt2d Focus2() const;
  //! Returns the center of the ellipse. <br>
       const gp_Pnt2d& Location() const;
  //! Returns the major radius of the Ellipse. <br>
        double MajorRadius() const;
  //! Returns the minor radius of the Ellipse. <br>
        double MinorRadius() const;
  
//!  Returns p = (1 - e * e) * MajorRadius where e is the eccentricity <br>
//!  of the ellipse. <br>
//!  Returns 0 if MajorRadius = 0 <br>
        double Parameter() const;
  //! Returns the major axis of the ellipse. <br>
       const gp_Ax22d& Axis() const;
  //! Returns the major axis of the ellipse. <br>
        gp_Ax2d XAxis() const;
  //! Returns the minor axis of the ellipse. <br>//! Reverses the direction of the circle. <br>
        gp_Ax2d YAxis() const;
  
        void Reverse() ;
  
        gp_Elips2d Reversed() const;
  //! Returns true if the local coordinate system is direct <br>
//!            and false in the other case. <br>
        bool IsDirect() const;
  
       void Mirror(const gp_Pnt2d& P) ;
  
//!  Performs the symmetrical transformation of a ellipse with respect <br>
//!  to the point P which is the center of the symmetry <br>
       gp_Elips2d Mirrored(const gp_Pnt2d& P) const;
  
       void Mirror(const gp_Ax2d& A) ;
  
//!  Performs the symmetrical transformation of a ellipse with respect <br>
//!  to an axis placement which is the axis of the symmetry. <br>
       gp_Elips2d Mirrored(const gp_Ax2d& A) const;
  
       void Rotate(const gp_Pnt2d& P,const double Ang) ;
  
       gp_Elips2d Rotated(const gp_Pnt2d& P,const double Ang) const;
  
       void Scale(const gp_Pnt2d& P,const double S) ;
  
//!  Scales a ellipse. S is the scaling value. <br>
       gp_Elips2d Scaled(const gp_Pnt2d& P,const double S) const;
  
       void Transform(const gp_Trsf2d& T) ;
  
//!  Transforms an ellipse with the transformation T from class Trsf2d. <br>
       gp_Elips2d Transformed(const gp_Trsf2d& T) const;
  
       void Translate(const gp_Vec2d& V) ;
  
//!  Translates a ellipse in the direction of the vector V. <br>
//!  The magnitude of the translation is the vector's magnitude. <br>
       gp_Elips2d Translated(const gp_Vec2d& V) const;
  
       void Translate(const gp_Pnt2d& P1,const gp_Pnt2d& P2) ;
  
//!  Translates a ellipse from the point P1 to the point P2. <br>
       gp_Elips2d Translated(const gp_Pnt2d& P1,const gp_Pnt2d& P2) const;
    const gp_Ax22d& _CSFDB_Getgp_Elips2dpos() const { return pos; }
    double _CSFDB_Getgp_Elips2dmajorRadius() const { return majorRadius; }
    void _CSFDB_Setgp_Elips2dmajorRadius(const double p) { majorRadius = p; }
    double _CSFDB_Getgp_Elips2dminorRadius() const { return minorRadius; }
    void _CSFDB_Setgp_Elips2dminorRadius(const double p) { minorRadius = p; }



protected:




private: 


gp_Ax22d pos;
double majorRadius;
double minorRadius;


};






// other  functions and methods (like "C++: function call" methods)



